/*
 * Robot5API.cpp
 *
 */

#include "Robot5API.h"
#include "../logger/logger.h"

namespace application {

Robot5API::Robot5API(){
	AdminKeys adminKeys("izq");
	this->m_ComRobot11_A = new middleware::CommunicationRobot11(adminKeys.getRobot11Key());
	this->m_ComCinta_A = new middleware::CommunicationPrimerCinta(adminKeys.getCintaKey());

	AdminKeys adminKeys2("der");
	this->m_ComRobot11_B = new middleware::CommunicationRobot11(adminKeys2.getRobot11Key());
	this->m_ComCinta_B = new middleware::CommunicationPrimerCinta(adminKeys2.getCintaKey());
}

Robot5API::~Robot5API(){
	delete this->m_ComRobot11_A;
	delete this->m_ComCinta_A;
	delete this->m_ComRobot11_B;
	delete this->m_ComCinta_B;
}

PendientesRobot5 Robot5API::verListaDeEventos(){
	this->listaPedidos = m_ComRobot5.getListaPedidos();
	return listaPedidos;
}

Canasto Robot5API::buscarCanastoDeADP(){ //almacen de piezas	
	this->listaPedidos.contador[R5_PEDIDOS_PENDIENTES_RECEPCION_CANASTOS]--;
	m_ComRobot5.setListaPedidos(listaPedidos);
	return m_ComRobot5.getCanastoDeADP();
}

void Robot5API::darCanastoAlAGV(int idAGV,Canasto canasto){
	m_ComRobot5.llevarCanastoAlAGV(idAGV,canasto);
}

PedidoCanasto Robot5API::verPedidoDeCanasto(){
	this->listaPedidos.contador[R5_PEDIDOS_PENDIENTES_CANASTOS]--;
	m_ComRobot5.setListaPedidos(listaPedidos);
	return m_ComRobot5.getPedidoDeCanasto();
}

void Robot5API::pedirCanastoAlADP(PedidoCanasto pc){
	sleep(2);
	Canasto c;
	c.idPieza = pc.idPieza;
	m_ComRobot5.pedirCanastoAlADP(c);
}

PedidoCintas Robot5API::verPedidoDeCinta(){ //el robot 11 le manda un pedido de cinta al 5
	this->listaPedidos.contador[R5_PEDIDOS_PENDIENTES_CINTAS]--;
	m_ComRobot5.setListaPedidos(listaPedidos);
	return m_ComRobot5.getPedidoDeCinta();
}

PedidoProduccion Robot5API::verPedidoDeProduccion(){
	this->listaPedidos.contador[R5_PEDIDOS_PENDIENTES_PROD]--;
	m_ComRobot5.setListaPedidos(listaPedidos);
	return m_ComRobot5.getPedidoDeProd();
}

void Robot5API::noHacerNada(){
	m_ComRobot5.noHacerNada();
}

int Robot5API::cantidadProductosEnCinta(int id){
	if(id==1){
		return m_ComCinta_A->cantidadProductosEnCinta();
	}else{
		return m_ComCinta_B->cantidadProductosEnCinta();
	}
	return 0;
}

void Robot5API::liberarPendientes(){
		m_ComRobot5.liberarPendientes();
}

//retorna true si puede mover la cinta y tiene espacio para seguir poniendo	
bool Robot5API::ponerProductoEnCinta(int cinta,Producto prod){
	bool hayEspacio=false;
	if(cinta==1){
		m_ComCinta_A->lockCinta();
		m_ComCinta_A->ponerProducto(prod);
		if (m_ComCinta_A->ultimoEspacioVacio()){
			m_ComCinta_A->moverCinta();
			hayEspacio=true;
		}
		m_ComCinta_A->unlockCinta();
		m_ComRobot11_A->despertarHayProductoCinta();
		CLogger::log("Desperte");

	}else{
		m_ComCinta_B->lockCinta();
		m_ComCinta_B->ponerProducto(prod);
		if (m_ComCinta_B->ultimoEspacioVacio()){
			m_ComCinta_B->moverCinta();
			hayEspacio=true;
		}
		m_ComCinta_B->unlockCinta();
		m_ComRobot11_B->despertarHayProductoCinta();
	}

	return hayEspacio;
}
} /* namespace application */
